package com.wjm.api.ReflectPackage;

import java.lang.reflect.Method;

/**
 * Data:2022年07月30日
 * Author:wjm
 * Content: Reflect反射机制（操作成员方法）
 *
 *
 *  获取成员方法：
 *          1）Method[] getMethods()
 *                   获取所有权限修饰符为public的成员方法，注意也包括继承下来的方法
 *
 *          2）Method[] getMethod(String name,Class<?>...parameterTypes)
 *                   获取指定名称，且权限修饰符为public的成员方法，第一个参数是指定方法的名称，第二个参数是指定方法需要的参数类型的Class对象
 *
 *          3）Method[] getDeclaredMethods()
 *                   获取所有的方法，不管是public或private修饰，注意该方法只能获取本地的成员方法，不包括继承下来的方法
 *
 *          4）Method[] getDeclaredMethod(String name,Class<?>...parameterTypes)
 *                   获取指定名字的方法，不管权限修饰符，第一个参数是指定方法的名称，第二个参数是指定方法需要的参数类型的Class对象
 *
 *          注意：
 *                   getMethods()是获取所有的public修饰的成员方法，包括继承的。而getDeclaredMethods()不考虑权限修饰符，但是只能
 *                   获取本地方法，不包括继承的方法
 *
 *
 *  执行方法：
 *          Object invoke(Object obj,Object...args)
 *                   第一个参数传执行该方法的对象，第二个参数传方法所需的参数
 *
 *
 *  获取方法名称：
 *          String getName()
 *                   获取方法名
 *
 */
public class ReflectDemo3 {
    public static void main(String[] args) throws Exception {
        //先获取Car类对象
        Car car = new Car();
        Class c = car.getClass();

        //获取所有的public修饰的成员方法
        Method[] methods1 = c.getMethods();
        for (Method m:methods1){
            System.out.println(m);
            //获取方法名
            System.out.println("方法名为："+m.getName());
        }
        System.out.println("----------------------------------");

        //获取所有的方法，不考虑权限修饰符
        Method[] methods2 = c.getDeclaredMethods();
        for (Method m:methods2){
            System.out.println(m);
            //获取方法名
            System.out.println("方法名为："+m.getName());
        }
        System.out.println("----------------------------------------");

        //获取指定名称的方法
        Method method1 = c.getMethod("getName");
        Method method2 = c.getMethod("setName", String.class);
        System.out.println(method1);
        System.out.println(method2);
        System.out.println("------------------------------------------");

        //执行方法
        Object name = method1.invoke(car);
        method2.invoke(car,"RGT");




    }
}
